// 此文件专门用于处理权限验证相关的代码
import { router, addRoutes } from '@/router/index.js'
import { getToken } from './composables/auth.js'
import { toast, showFullLoading, hideFullLoading } from './composables/util.js'
import { getinfo } from './apis/manager'
import { useUserStore } from './store'

// 全局路由前置守卫
// to代表前往哪个路径；from代表从哪个路径来；next代表放行操作
router.beforeEach((to, from, next) => {
  const userStore = useUserStore()
  // 显示loading进度条
  showFullLoading()

  // 1.没有登录且当前页不是登录页，强制跳转回登录页
  if (!getToken() && to.path != '/login') {
    // 1.1没有登录，要给用户提示
    toast('请先登录', 'error')
    // 1.2强制跳转回登录页
    return next({ path: '/login' })
  }

  // 2.防止重复登录(当前已经登录，并前往的页面时登录页面时)
  if (getToken() && to.path == '/login') {
    toast('请勿重复登录', 'error')
    // 从哪里来回到哪里去(如果from.path有值，就返回到from.path，否则返回到后台首页)
    return next({ path: from.path ? from.path : '/' })
  }

  //因为每个页面都需要进行权限验证，所以在这里面判断 菜单数据有了没有，如果没有，我们需要发送请求，来动态获取菜单数据
  if (getToken() && userStore.menus.length === 0) {
    getinfo().then((res) => {
      // 把请求成功后的菜单数据放在pinia中
      // 把数据放在pinia中
      userStore.menus = res.menus

      // 封装用户信息(用于在头部展示用户名称和图像)
      userStore.username = res.username
      userStore.avatar = res.avatar

      // 动态添加路由
      addRoutes(res.menus)
      //要在路由添加进来之后重新跳转到一个指定路由,然后才能在动态路由生成之后跳转到指定理由
      next(to.fullPath)
    })
  }else{
    next()
  }

  // 设置页面标题（三元表达式）
  const title = (to.meta.title ? to.meta.title : '') + '-编程学习'
  document.title = title
})

// 全局路由后置守卫
router.afterEach(() => {
  //隐藏全局loading进度条
  hideFullLoading()
})
